home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_asm / asm_kit / hercules.asm < prev    next >
Assembly Source File  |  1985-12-08  |  13KB  |  563 lines

  1. ;*********************************************
  2. ; *  HERCULES GRAPHICS CARD UTILITY ROUTINES *
  3. ; *   graph_mode(),text_mode(),plot(x,y)     *
  4. ;*********************************************
  5. ;****************************************************************************
  6. ;* graph_mode() : puts the hercules graphics card into its graphics mode
  7. ;****************************************************************************
  8. ;    ******** hercules port addresses ********
  9. INDEX_PORT        equ    03b4H
  10. CTL_PORT        equ    03b8H
  11. CONFIG_PORT        equ    03BFH
  12.  
  13. ;    ******** hercules ctl codes **********
  14. SCRN_ON        equ    8
  15. GRPH        equ    2
  16. TEXT        equ    20H
  17. FULL_MODE    equ    03H
  18.  
  19. DSEG
  20. gtable        db        35H,2DH,2EH,07H
  21.         db        5BH,02H,57H,57H
  22.         db        02H,03H,00H,00H
  23.  
  24. ttable        db        61H,50H,52H,0FH
  25.             db        19H,06H,19H,19H
  26.             db        02H,0DH,0BH,0CH
  27.  
  28. video_page_base_    dw         0,0B000H          ;double-word addr= B000:0000H
  29.  
  30.             public cursor_x_,cursor_y_,grph_attrib_
  31. cursor_x_            dw        0
  32. cursor_y_            dw        0
  33. grph_attrib_        db        0
  34. CSEG
  35. setmd_:
  36. ;        sets mode to graphics or TEXT
  37. ;        depending on al
  38. ;        si=parameter table
  39. ;        cx=number of words to be cleared
  40. ;        bx=blank value
  41.         push ds
  42.         push es
  43.         push ax                        ;push mode
  44.         push bx                        ;push blank value
  45.         push cx                        ;push # of words to be cleared
  46.  
  47.         mov dx,CTL_PORT                ;change mode but without SCRN_ON
  48.         out dx,al
  49.  
  50.         mov ax,ds                    ;point es:si to parameter table
  51.         mov es,ax
  52.  
  53.         mov dx,INDEX_PORT
  54.         mov cx,12                    ;12 parameters to be output
  55.         xor ah,ah                    ;starting from reg 0
  56.  
  57. parms:        mov al,ah
  58.         out dx,al
  59.         inc dx
  60.         lodsb
  61.         out dx,al                    ; output data from table
  62.         inc ah
  63.         dec dx
  64.         loop parms
  65.  
  66.         pop cx                        ;clear the buffer
  67.         mov ax,0b000h
  68.         cld                            ;setting up for string instruction here
  69.  
  70.         mov es,ax
  71.         xor di,di
  72.         pop ax
  73.         rep stosw
  74.  
  75.         mov dx,CTL_PORT                ;turn scrn on, point to page 0
  76.         pop ax
  77.         add al,SCRN_ON
  78.         out dx,al
  79.  
  80.         pop es
  81.         pop ds
  82.         ret        
  83.  
  84. ;****************************************************************************
  85. ;* graph_mode() : puts the hercules graphics card into its graphics mode
  86. ;****************************************************************************
  87. CSEG
  88.             public graph_mode_
  89. graph_mode_:
  90.     push bp
  91.     push es
  92.     mov al,FULL_MODE
  93.     mov dx,CONFIG_PORT
  94.     out dx,al                                                ;HGC FULL
  95.     mov al,GRPH
  96.     lea si,gtable
  97.     mov bx,0
  98.     mov cx,4000h
  99.     call setmd_
  100.     pop es
  101.     pop bp
  102.     ret
  103.  
  104. ;****************************************************************************
  105. ;*  TEXT_mode() : puts the hercules graphics card into TEXT mode
  106. ;****************************************************************************
  107.  
  108.             public TEXT_mode_
  109. TEXT_mode_:
  110.             push bp
  111.             push es
  112.             mov al,TEXT
  113.             lea si,ttable
  114.             mov bx,720h
  115.             mov cx,2000
  116.             call setmd_
  117.             pop es
  118.             pop bp
  119.             ret
  120.  
  121. ;****************************************************************************
  122. ;* plot(x,y)  lights the pixel located at coordinates x,y
  123. ;*  Hercules graphics card version.... 
  124. ;****************************************************************************
  125. ;byte-addr = [2000H + (Ymod4)] + [90*INT(Y/4)] + INT(X/8)
  126. ;bit-offset = 7-(Xmod8)
  127.         public plot_
  128. plot_:                            ;scrambles ax,bx,cx,dx,es
  129.         push bp
  130.         mov bp,sp
  131.         mov ax,[bp+6]            ;y in bx
  132.         and ax,0003H            ;(Ymod4) in bx
  133.         mov bx,2000H
  134.         mul bx                    ;(Ymod4)*2000H in ax
  135.         mov bx,ax                ;(Ymod4)*2000H in bx
  136.  
  137.         mov ax,[bp+6]
  138.         shr ax,1
  139.         shr ax,1                    ;int(y/4) in ax
  140.         mov cx,90                    ;can't multiply by immediate
  141.         mul cx                        ;int(y/4) * 90 in ax
  142.         add bx,ax                    ;[int(y/4) * 90]+[(Ymod4)+2000H] in bx
  143.  
  144.         mov ax,[bp+4]                ;x in ax
  145.         shr ax,1
  146.         shr ax,1
  147.         shr ax,1                    ;int(x/8) in bx
  148.         add ax,bx                ;whole byte offset address in ax
  149.         les bx,video_page_base_    ;es:bx points to video base
  150.         add bx,ax                ;entire address in es:bx
  151.         mov ax,[bp+4]            ;X in ax
  152.         and ax,0000000000000111B        ;Xmod8 in ax
  153.         mov cl,al                ;Xmod8 becomes shift count
  154.         mov al,10000000B        ;start from the top
  155.         shr al,cl                ;bit pos is now in al, addr in es:bx
  156.  
  157.         or es:[bx],al            ;this one does the deed!
  158.  
  159.         pop bp 
  160.         ret
  161.     
  162. ;*****************************************
  163. ;* init_page_1() copies page 0 into page 1
  164. ;*****************************************
  165.             public init_page_1_
  166. init_page_1_:                    
  167.         push bp
  168.         push es
  169.         push si
  170.         push di
  171.         push ds
  172.         mov ax,0B000H
  173.         mov es,ax                ;es and ds both point to video ram
  174.         mov ds,ax                ;no working variables... might have to move this one
  175.         mov si,0                ;source is page 1
  176.         mov di,8000H            ;dest is page 2
  177.         mov cx,8000H            ;xfr 8000 bytes(one graphics page)
  178.         cld                        ;going up...
  179.         rep movsb                ;do it to it!
  180.         pop ds
  181.         pop di
  182.         pop si
  183.         pop es
  184.         pop bp
  185.         ret
  186.  
  187. ;*****************************************
  188. ;* init_page_0() copies page 1 into page 0
  189. ;*****************************************
  190.             public init_page_0_
  191. init_page_0_:
  192.         push bp
  193.         push es
  194.         push si
  195.         push di
  196.         push ds
  197.         mov ax,0B000H
  198.         mov es,ax                ;es and ds both point to video ram
  199.         mov ds,ax                ;no working variables... might have to move this one
  200.         mov si,8000H                ;source is page 1
  201.         mov di,0            ;dest is page 0
  202.         mov cx,4000H            ;xfr 8000 bytes(one graphics page)
  203.         cld                        ;going up...
  204.         rep movsw                ;do it to it!
  205.         pop ds
  206.         pop di
  207.         pop si
  208.         pop es
  209.         pop bp
  210.         ret
  211.  
  212. ;*******************************************************************
  213. ;* graphics_cls(page) clears the screen when it's in graphics mode *
  214. ;*******************************************************************
  215. ;1  process graphics_cls
  216.         public graphics_cls_
  217. graphics_cls_:
  218.  
  219.         push bp
  220.         mov bp,sp            ;page# in [bp+4]
  221.  
  222.    ;2  if we need to clear page 0
  223.         mov ax,[bp+4]
  224.         or ax,ax
  225.         jnz graphics_cls_1
  226.  
  227.       ;3  point at page 0
  228.         mov di,0000H
  229.  
  230.    ;2  else(we need to clear page 1)
  231.         jmp graphics_cls_2
  232. graphics_cls_1:
  233.  
  234.       ;3  point at page 1
  235.         mov di,8000H
  236.  
  237.    ;2  endif(page 0 or 1?)
  238. graphics_cls_2:
  239.  
  240.    ;2  set up the rest of the block load
  241.         mov ax,0B000H
  242.         mov es,ax            ;video base addr
  243.         mov cx,8000H            ;length of page
  244.         mov ax,0
  245.         cld                ;load UP
  246.         rep stosb
  247.  
  248.    ;2  zero out the graphics cursor
  249.         mov ax,0
  250.         mov cursor_x_,ax
  251.         mov cursor_y_,ax
  252.  
  253. ;1  endprocess graphics_cls
  254.         pop bp
  255.         ret
  256.  
  257. ;/********************************************************/
  258. ; Hercules graphic text drawing routines
  259. ;/********************************************************/
  260. include "hercfont.a"
  261.  
  262. y_table_:                            ;tells us the starting y offset for a char
  263.                                     ;it has one entry for each of the 27 rows
  264.         dw 0000H                    ;letter row 0
  265.         dw 210EH                    ;letter row 1
  266.         dw 421CH                    ;letter row 2
  267.         dw 632AH                    ;letter row 3
  268.         dw 0492H                    ;letter row 4
  269.         dw 25A0H                    ;letter row 5
  270.         dw 46AEH                    ;letter row 6
  271.         dw 67BCH                    ;letter row 7
  272.         dw 0924H                    ;letter row 8
  273.         dw 2A32H                    ;letter row 9
  274.         dw 4B40H                    ;letter row 10
  275.         dw 6C4EH                    ;letter row 11
  276.         dw 0DB6H                    ;letter row 12
  277.         dw 2EC4H                    ;letter row 13
  278.         dw 4FD2H                    ;letter row 14
  279.         dw 70E0H                    ;letter row 15
  280.         dw 1248H                    ;letter row 16
  281.         dw 3356H                    ;letter row 17
  282.         dw 5464H                    ;letter row 18
  283.         dw 7572H                    ;letter row 19
  284.         dw 16DAH                    ;letter row 20
  285.         dw 37E8H                    ;letter row 21
  286.         dw 58F6H                    ;letter row 22
  287.         dw 7A04H                    ;letter row 23
  288.         dw 1B6CH                    ;letter row 24
  289.         dw 3C7AH                    ;letter row 25
  290.  
  291.  
  292. CSEG
  293. ;*******************************************
  294. ;* set plot_tty_cursor(x,y)
  295. ;*******************************************
  296.         public set_plot_tty_cursor_
  297. set_plot_tty_cursor_:
  298.         push bp
  299.         mov bp,sp
  300.         mov ax,[bp+4]
  301.         mov cursor_x_,ax
  302.         mov ax,[bp+6]
  303.         mov cursor_y_,ax
  304.         pop bp
  305.         ret
  306.  
  307. ;*******************************************
  308. ;1  process plot_char_tty(ascii_char)
  309.         public plot_char_tty_
  310. plot_char_tty_:
  311.         push bp
  312.         mov bp,sp
  313.  
  314.    ;2  if this is not a control char
  315.         mov al,[bp+4]
  316.         and al,07FH
  317.         cmp al,20H
  318.         jc plot_char_tty_1
  319.  
  320.       ;3  output char at current cursor position
  321.         mov al,[bp+4]
  322.         push ax
  323.         mov ax,cursor_y_    
  324.         push ax
  325.         mov ax,cursor_x_
  326.         push ax
  327.         call plot_char_
  328.         add sp,6
  329.         
  330.       ;3  increment cursor position
  331.         call increment_cursor_
  332.  
  333.    ;2  else (ctl char)
  334.         jmp plot_char_tty_2
  335. plot_char_tty_1:
  336.  
  337.       ;3  if the char is a <CR>
  338.             mov al,[bp+4]
  339.             cmp al,0Dh
  340.             jnz plot_char_tty_3
  341.  
  342.          ;4  cursor_x_ = 0
  343.             mov ax,0
  344.             mov cursor_x_,ax
  345.  
  346.       ;3  else if the char is <LF>
  347.             jmp plot_char_tty_4
  348. plot_char_tty_3:
  349.             cmp al,0AH
  350.             jnz plot_char_tty_4
  351.  
  352.          ;4  cursor_y_++
  353.             mov ax,cursor_y_
  354.             inc ax
  355.             mov cursor_y_,ax
  356.             cmp ax,26                        ;line at bottom will roll over to
  357.             jc plot_char_tty_5                ;top
  358.             mov ax,0
  359.             mov cursor_y_,ax
  360. plot_char_tty_5:
  361.  
  362.       ;3  endelseif
  363. plot_char_tty_4:
  364.  
  365.    ;2  endif(ctl char?)
  366. plot_char_tty_2:
  367.  
  368. ;1  endprocess plot_char_tty
  369.         pop bp            
  370.         ret
  371.  
  372. ;************************************
  373. ;* plot_char(x,y,ascii_char) 
  374. ;* x can be from 0 thru 89                [bp+4] = x,[bp+6]=y,[bp+8]=ascii_char
  375. ;* y can be from 0 thru 25
  376. ;************************************
  377. ;* sets global cursor_x and cursor_y to where it's own parameters
  378. ;we have defined font patterns for ascii 20H thru 5AH
  379. ;1  process plot_char            ;destroys contents of bx,si,ax,es
  380.         public plot_char_
  381. plot_char_:
  382.         push bp
  383.         mov bp,sp
  384.  
  385.    ;2  convert the ascii char to a table pointer
  386.         mov al,[bp+8]
  387.         push ax
  388.         call convert_ascii_
  389.         add sp,2
  390.         mov [bp+8],ax                ;table ptr in [bp+8]
  391.  
  392.    ;2  point to the beginning of the char in video ram
  393.         les bx,video_page_base_            ;es:bx point to video card base
  394.         mov bx,[bp+6]            ;y in bx
  395.         add bx,bx                ;two bytes per table entry
  396.         mov ax,y_table_[bx]        ;address in ax
  397.         add ax,[bp+4]            ;add in x
  398.         mov bx,ax        ;es:bx now point to video board char position
  399.  
  400.         mov si,[bp+8]        ;ds:si points to table
  401.         mov al,[si]        ;first byte in al
  402.         xor al,grph_attrib_        ;reverse video?
  403.         mov es:[bx],al        ;out to video
  404.  
  405.    ;2  repeat
  406.         mov cx,9
  407. plot_char_1:
  408.  
  409.       ;3 increment table pointer
  410.         inc si
  411.  
  412.       ;3  increment video ram pointer
  413.         add bx,2000H                        ;point to next bank
  414.         cmp bx,8000H                        ;do we roll over
  415.  
  416.         jc plot_char_2                        ;pop over this next if 8000H bigger
  417.         add bx,5AH
  418.         and bx,1FFFH                        ;and referance back down to 1st bank
  419. plot_char_2:
  420.  
  421.       ;3  move char pattern out to video ram
  422.         mov al,[si]
  423.         xor al,grph_attrib_                    ;reverse video if grph_attrib=ff
  424.         mov es:[bx],al
  425.  
  426.    ;2  9 times
  427.         loop plot_char_1
  428.  
  429. ;1 endprocess plot_char
  430.         pop bp
  431.         ret
  432.  
  433. ;1  process convert_ascii
  434.         public convert_ascii_
  435. convert_ascii_:
  436.         push bp
  437.         mov bp,sp                    ;input parameter = [bp+4]
  438.  
  439.    ;2  make input into 7-bit ascii
  440.         mov al,[bp+4]
  441.         and al,07FH
  442.         mov [bp+4],al
  443.  
  444.    ;2  if input > bottom-ot-ascii-table -1
  445.         cmp al,17H
  446.         jc convert_ascii_1
  447.  
  448.       ;3  if input < end of ascii table + 1
  449.         mov al,[bp+4]
  450.         sub al,7BH
  451.         jnc convert_ascii_3
  452.         
  453.          ;4 just leave it unmolested
  454.  
  455.       ;3  else (input > 5BH)
  456.         jmp convert_ascii_4
  457. convert_ascii_3:
  458.  
  459.          ;4  return space
  460.         mov byte [bp+4],20H
  461.  
  462.       ;3  endif(input < 5bH?)
  463. convert_ascii_4:
  464.  
  465.    ;2  else (input not greater than 1FH)
  466.         jmp convert_ascii_2
  467. convert_ascii_1:
  468.  
  469.       ;2 return space
  470.         mov byte [bp+4],20H
  471.  
  472.    ;2  endif
  473. convert_ascii_2:
  474.  
  475.    ;2  get the output parameter
  476.         mov ax,[bp+4]                ;index into table
  477.         sub ax,18H                    ;- offset(18H is first table entry)
  478.         mov bx,10                    ;times bytes/entry
  479.         mul bx                        ;answer still fits in ax
  480.         add ax,offset ascii_table_
  481.  
  482. ;1  endprocess convert_ascii
  483.         pop bp
  484.         ret
  485.  
  486. ;*******************************************
  487. ;1  process plot_string(string)
  488.         public plot_string_
  489. plot_string_:
  490.         push bp
  491.         mov bp,sp
  492.  
  493.    ;2  get parameter
  494.         mov bx,[bp+4]
  495.         
  496.    ;2  get first char
  497.         mov al,[bx]        
  498.         
  499.    ;2  repeat
  500. plot_string_1:
  501.  
  502.       ;3  plot_char_tty(char)
  503.         push bx
  504.         push ax
  505.         call plot_char_tty_
  506.         add sp,2
  507.         pop bx
  508.  
  509.       ;3  get next char
  510.         inc bx
  511.         mov al,[bx]
  512.  
  513.    ;2  until character=0
  514.         or al,al
  515.         jnz plot_string_1
  516.  
  517. ;1  endprocess plot_string
  518.         pop bp
  519.         ret
  520.  
  521. ;*******************************************
  522. ;1  process increment_cursor
  523.         public increment_cursor_
  524. increment_cursor_:
  525.         push bp
  526.  
  527.    ;2  increment cursor_x_ position
  528.         mov ax,cursor_x_
  529.         inc ax                                ;cursor_x_+1 in ax
  530.         mov cursor_x_,ax
  531.  
  532.    ;2  if cursor_x_ got to 80
  533.         cmp ax,80
  534.         jc increment_cursor_1
  535.  
  536.       ;3  cursor_x_ = 0
  537.         mov ax,0
  538.         mov cursor_x_,ax
  539.  
  540.       ;3  cursor_y_++
  541.         mov ax,cursor_y_
  542.         inc ax
  543.         mov cursor_y_,ax
  544.  
  545.       ;3  if cursor_y_ = 26
  546.         cmp ax,26
  547.         jnz increment_cursor_2
  548.  
  549.          ;4  cursor_y_ = 0
  550.         mov ax,0
  551.         mov cursor_y_,ax
  552.         
  553.       ;3  endif(cursor_y_= 26?)
  554. increment_cursor_2:
  555.  
  556.    ;2  endif(cursor_y_= 80?)
  557. increment_cursor_1:
  558.  
  559. ;1  endprocess increment_cursor_
  560.         pop bp
  561.         ret
  562.  
  563.